package com.example.producer;

import com.example.util.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.MessageProperties;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

public class Sender {

    private final static String QUEUE_NAME = "task-queue";
    public static void main(String[] args) throws IOException, TimeoutException {

        try(Connection connection = ConnectionUtils.openConnection("Sender1");
            Channel channel = connection.createChannel()
        ){
            // 声明一个队列
            // queueDeclare()方法参数说明：
            // queue – 队列的名称
            // durable（持久） - 如果我们声明一个持久队列，则为真（该队列将在服务器重启后继续存在）
            // exclusive（独占） – 设为true表示声明一个排他队列，排他队列的特点是只能被当前的连接使用，并且在连接关闭后被删除。
            // autoDelete – 如果我们声明一个自动删除队列，则为 true（服务器将在不再使用时将其删除）
            final boolean durable = true; // 将task-queue队列声明为持久的，这样mq服务器重启后，队列依旧存在
            channel.queueDeclare(QUEUE_NAME, durable, false, false, null);

            for (int i = 0; i < 50; i++) {
                String message = "message " + i;
                // 将message发生到指定交换机
                // 参数说明：
                // exchange - 交换机，为""则表示使用mq默认的交换机
                // routingKey – 路由key，交换机根据路由key来将消息转发到指定的队列，如果使用默认交换机，routingKey设置为队列的名称
                // props - 消息的其他属性 -  routing headers等
                // body – 消息正文
                channel.basicPublish("",
                        QUEUE_NAME,
                        MessageProperties.PERSISTENT_TEXT_PLAIN, // 将消息标记为持久性的。注意，将消息标记为持久并不能完全保证消息不会丢失。虽然它告诉 RabbitMQ 将消息保存到磁盘，但是当 RabbitMQ 已经接受一条消息并且还没有保存它时，仍然有很短的时间窗口。此外，RabbitMQ 不会对每条消息都执行fsync(2) —— 它可能只是保存到缓存中，而不是真正写入磁盘。持久性保证不强，但对于我们简单的任务队列来说已经足够了。如果您需要更强的保证，那么您可以使用 发布者确认。
                        message.getBytes(StandardCharsets.UTF_8)
                        );
            }
        }

    }
}
